CloudWatch cross-account observability で特定メトリクスを集約する(CloudFormation使用)
CloudWatch cross-account observability(クロスアカウントオブザーバビリティ)は、 複数アカウントにまたがる監視を実現するための機能です。 CloudWatch Observability Access Manager(OAM) と呼ばれます。
この機能を使うことで以下のような監視リソースを、 モニタリングアカウントへ集約できます。
- CloudWatch メトリクス
- CloudWatch Logs ロググループ
- X-Ray トレース
- CloudWatch Application Insights アプリケーション
- CloudWatch Internet Monitor モニタリング
今回はこれを使って特定のCloudWatchメトリクスを、 モニタリングアカウントへ集約してみます。
前提: 本ブログでの集約について
今回は以下のような集約を実現します。
- ソースアカウントは「特定の組織単位(OU)に所属しているAWSアカウント群」とします
- モニタリングアカウントへ 「Transit Gateway および NATGateway のメトリクス」を集約します
モニタリングアカウント側の設定
モニタリングアカウントでは シンク(sink) を作成します。 シンクに対してソースアカウントがリンク(link)することで メトリクスやログを集約できます。 なおシンクは「アカウント×リージョン」ごとに1つのみ作成できます。
以下のような CFnテンプレートを作成しました。 AWS::Oam::Sink リソースを作成します。
AWSTemplateFormatVersion: 2010-09-09 Description: "create a sink in CloudWatch cross-account observability" Parameters: SinkName: Description: "A name for the sink." Type: String Default: "sink" PrincipalOrgID: Description: "An Organization Id." Type: String Default: "o-xxxxxxxxxxx" Resources: OAMSink: Type: AWS::Oam::Sink Properties: Name: !Ref SinkName Policy: Version: '2012-10-17' Statement: - Effect: Allow Principal: "*" Resource: "*" Action: - "oam:CreateLink" - "oam:UpdateLink" Condition: StringEquals: aws:PrincipalOrgID: !Ref PrincipalOrgID ForAllValues:StringEquals: oam:ResourceTypes: - "AWS::CloudWatch::Metric" Outputs: OAMSinkArn: Value: !Ref OAMSink Export: Name: !Ref SinkName
パラメータには2つ指定します。
SinkName
: シンクの名前PrincipalOrgID
: 組織ID (管理アカウントで aws organizations list-roots を実行して確認できます)
このテンプレートを展開します。展開には rain (便利なCFn操作ツール)を使いました。
rain deploy \ ./example/oam-sink.yaml oam-sink \ --params SinkName="sink",PrincipalOrgID="o-example" # CloudFormation will make the following changes: # Stack oam-sink # + AWS::Oam::Sink OAMSink # Do you wish to continue? (Y/n) Y # Deploying template 'oam-sink.yaml' as stack 'oam-sink' in ap-northeast-1. # Stack oam-sink: CREATE_COMPLETE # Outputs: # OAMSinkArn: arn:aws:oam:ap-northeast-1:111111111111:sink/9e11example # exported as sink # Successfully deployed oam-sink
展開後の シンクARN(OAMSinkArn)は後ほど使うのでメモしておきます。
[CFnテンプレート補足] CloudFormation内で設定している シンクポリシーはAWSアカウントID単位でも指定可能です。 指定方法は AWS::Oam::Sink の Examples を参照ください。
ソースアカウント側の設定
ソースアカウント側では リンク(link) を作成します。 リンク上で「どの監視リソースタイプを送信するか」や 「どのメトリクス(やログ)を送信するか」と指定できます。 アカウント内に最大 5個のリンクを作成できます。
以下のような CFnテンプレートを作成しました。 AWS::Oam::Link リソースを作成します。
AWSTemplateFormatVersion: 2010-09-09 Description: "create a link in CloudWatch cross-account observability" Parameters: SinkAccountId: Description: "The monitoring account ID." Type: String SinkIdentifier: Description: "The ARN of the sink in the monitoring account that you want to link to." Type: String Conditions: IsNotSinkAccount: Fn::Not: - !Equals [!Ref "AWS::AccountId" , !Ref SinkAccountId] Resources: OAMLink: Condition: IsNotSinkAccount Type: AWS::Oam::Link Properties: LabelTemplate: "$AccountName" LinkConfiguration: MetricConfiguration: Filter: "Namespace IN ('AWS/TransitGateway', 'AWS/NATGateway')" ResourceTypes: - "AWS::CloudWatch::Metric" SinkIdentifier: !Ref SinkIdentifier
パラメータには2つ指定します。
SinkAccountId
: シンクがあるモニタリングアカウントのIDSinkIdentifier
: 先ほどメモしたシンクのARN
このテンプレートを展開します。CFn StackSets(service-managed) としてOU単位で展開します。
sink_account_id="111111111111" sink_id="arn:aws:oam:ap-northeast-1:111111111111:sink/9e11example" ou_id="ou-aaaa-example" # スタックセット作成 aws cloudformation create-stack-set \ --stack-set-name OAM-LINK-NETWORK-METRICS \ --description "create a link in CloudWatch cross-account observability" \ --template-body file://./example/oam-link.yaml \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false \ --parameters \ ParameterKey=SinkAccountId,ParameterValue="${sink_account_id}" \ ParameterKey=SinkIdentifier,ParameterValue="${sink_id}" \ --call-as DELEGATED_ADMIN # CFn委任管理者からの実行の場合に必要 # スタックインスタンス展開 aws cloudformation create-stack-instances \ --stack-set-name OAM-LINK-NETWORK-METRICS \ --deployment-targets OrganizationalUnitIds="${ou_id}" \ --regions ap-northeast-1 \ --call-as DELEGATED_ADMIN
[補足] 制約として、モニタリングアカウントに対して「自分自身のリンク」は作成できません。 そのため CFnテンプレートにて「モニタリングアカウント自身の場合はリンクを作らない」ような Condition を定めています。
確認する
ソースアカウント上で確認
[CloudWatch > 設定 > リンクされたモニタリングアカウント] から設定を確認できます。
メトリクスを選択すると、メトリクスクエリが表示されます。
モニタリングアカウント上で確認
モニタリングアカウント上で集約したメトリクスが表示できるか、確認します。
Transit Gateway や NATGateway のメトリクスを集約できていました。 [アカウントラベル] が追加されていて、アカウント名でフィルタできる点が大きな特徴です。
CloudWatchアラームはモニタリングアカウント上で作成できます。
また、AWS CLI でメトリクス一覧を確認(aws cloudwatch list-metrics)する際には、 --include-linked-accounts
オプションが必要です。
##### デフォルトだと他アカウントのメトリクスは出てこない aws cloudwatch list-metrics --output yaml --namespace "AWS/NATGateway" # Metrics: [] ##### include-linked-accounts オプションを付与 aws cloudwatch list-metrics --output yaml --namespace "AWS/NATGateway" \ --include-linked-accounts | head # Metrics: # - Dimensions: # - Name: NatGatewayId # Value: nat-067aexample # MetricName: ErrorPortAllocation # Namespace: AWS/NATGateway # - Dimensions: # - Name: NatGatewayId # Value: nat-067aexample # MetricName: ConnectionAttemptCount ##### owning-account オプションでアカウントを絞れる aws cloudwatch list-metrics --output yaml --namespace "AWS/NATGateway" \ --include-linked-accounts --owning-account 222222222222 | head # Metrics: # - Dimensions: # - Name: NatGatewayId # Value: nat-0981example # MetricName: ErrorPortAllocation # Namespace: AWS/NATGateway # - Dimensions: # - Name: NatGatewayId # Value: nat-0981example # MetricName: ConnectionAttemptCount
おわりに
以上、CloudWatch クロスアカウントオブザーバビリティを使って メトリクスを集約してみました。
複数アカウントに跨って展開したリソースを 監視したいときに非常に便利です。 ダッシュボードやアラームをどんどん集中管理していきましょう。
以上、参考になれば幸いです。